using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace HerenityCode.Reference
{
    namespace SingletonPattern
    {
        /// <summary>
        /// Description：继承MonoBehaviour的单例模式基类，继承了这个类的类就继承了MonoBehaviour，并且自带单例模式。
        /// Author:哒先生
        /// Date:2024年10月9日15:19:22
        /// </summary>
        public class SingletonPatternMonoBase<T> : MonoBehaviour where T : MonoBehaviour
        {
            //构造方法私有化，防止外部new对象。
            protected SingletonPatternMonoBase()
            {
            }

            //记录单例对象是否存在。用于防止在OnDestroy方法中访问单例对象报错。
            public static bool IsExisted { get; private set; } = false;

            //镜像
            public static bool isMirror = false;

            //提供一个属性给外部访问，这个属性就相当于是单例对象。
            private static T _instance;

            public static T Instance
            {
                get
                {
                    if (_instance == null && !isMirror)
                    {
                        _instance = FindObjectOfType<T>();

                        if (_instance != null)
                        {
                            IsExisted = true;
                        }
                    }

                    return _instance;
                }
            }
            
            protected virtual void OnDestroy()
            {
                IsExisted = false;
            }
        }
    }
}
